package main

import (
	"fmt"
	"net"
)

/* 变量的初始化：
整型和浮点型变量的默认值为0和0.0
字符串变量的默认值为空字符串
布尔型变量默认为bool
切片、函数、指针变量的默认为nil
*/

/* 变量的作用域：
局部变量：在函数体内声明的变量，作用域只在函数体内，函数的参数和返回值变量都属于局部变量。

全局变量：在函数体外声明的变量，全局变量只需要在一个源文件中定义，就可以在所有源文件中使用，必须使用var关键字声明，如果想要在外部包中使用首字母必须大写。

形式参数：在定义函数时函数名后面括号中的变量，只在函数调用时才会生效，函数调用结束后就会被销毁，在函数未被调用时，函数的形参并不占用实际的存储单元，也没有实际值。形式参数会作为函数的局部变量来使用。
*/

func main() {

	// var 变量名 类型 = 表达式

	var hp int = 100
	fmt.Println(hp)

	var hp2 = 110
	fmt.Println(hp2)

	var attack = 40
	var defence = 20
	var damageRate float32 = 0.17
	var damage = float32(attack-defence) * damageRate
	fmt.Println(damage)

	// 多变量同时声明
	var conn net.Conn
	var err error
	conn, err = net.Dial("tcp", "127.0.0.1:8080")
	fmt.Println(conn, err)

	// 变量交换
	var a int = 100
	var b int = 200
	a = a ^ b
	b = b ^ a
	a = a ^ b
	fmt.Println(a, b)

	// 变量交换
	b, a = a, b
	fmt.Println(a, b)

	// 匿名变量
	a1, _ := GetData()
	fmt.Println(a1)
}

func GetData() (int, int) {
	return 100, 200
}
